Day 5 我們已經把 Prometheus 的資料接到 Grafana,也做出了第一個 Dashboard。
目前已經可以直接看到:
Server Status
CPU Usage
Memory Usage
到這裡,「看得到」這件事情算是完成了。
但實際維運時有一個很現實的問題:
不可能一直有人盯著 Grafana。
如果今天 CPU 半夜突然跑到 95%,五分鐘後又恢復正常,隔天再打開 Dashboard 時,可能根本不會注意到曾經發生過異常。
所以今天要往下一步走:
讓系統自己判斷什麼時候算異常。
今天要做到什麼?
今天只設定一條規則:
server01
CPU 使用率 > 90%
持續 5 分鐘
↓
產生 Alert
先不要一次設定 CPU、Memory、Disk、Network。
只要第一條告警可以正常運作,後面的規則基本上都是同樣的概念。
為什麼不是 CPU 一超過 90% 就告警?
假設 Server 正在做某個工作:
CPU
40%
45%
93%
52%
48%
CPU 可能只是短暫衝高。
如果只要超過 90% 就立刻告警,很容易產生一堆沒有必要處理的通知。
所以我希望第一條規則是:
CPU 超過 90%,而且持續 5 分鐘,才算真正的異常。
這也是設定監控告警時很重要的一個觀念。
不是看到數字高就一定有問題,而是要考慮:
數值 + 持續時間
Step 1:先確認 CPU 查詢
先回到 Grafana。
我們 Day 5 已經使用過這段 PromQL:
100 - (
avg by(instance) (
rate(
node_cpu_seconds_total{
job="server01",
mode="idle"
}[5m]
)
) * 100
)
這段查詢最後會得到類似:
instance CPU
192.168.1.101:9100 35%
也就是目前 server01 的 CPU 使用率。
今天的 Alert 就直接使用這個結果。
Step 2:建立 Alert Rule
進入 Grafana:
Alerting
↓
Alert rules
↓
New alert rule
不同 Grafana 版本的介面名稱可能稍微不同,但概念基本上一樣。
Alert 名稱可以先設定:
Server01 High CPU
接著 Data Source 選擇:
Prometheus
Query 放入剛才的 CPU PromQL。
Step 3:設定 CPU > 90%
接著設定判斷條件。
我們希望:
CPU Usage > 90
所以 Threshold 設定成:
IS ABOVE
90
概念就是:
CPU <= 90%
Normal
如果:
CPU > 90%
Alert Condition
到這裡,Grafana 已經知道什麼叫做「CPU 過高」。
Step 4:加入持續時間
但前面提到,我不希望 CPU 瞬間衝高就直接產生告警。
所以再設定:
For:5m
整條規則現在就變成:
CPU > 90%
+
持續 5 分鐘
↓
High CPU Alert
這樣就比較接近平常實際監控會使用的方式。
Alert 的幾個狀態
設定完成之後,在 Grafana 裡通常會看到幾種不同狀態。
Normal
目前沒有達到告警條件。
CPU 35%
Normal
Pending
已經超過門檻,但還沒有持續到設定時間。
例如:
CPU 95%
持續 2 分鐘
Pending
因為我們設定要持續 5 分鐘,所以現在還不會正式觸發。
Firing
如果:
CPU 95%
持續超過 5 分鐘
就會進入:
Firing
代表這個問題已經符合我們定義的告警條件。
可以簡單理解成:
Normal
↓
CPU > 90%
↓
Pending
↓
持續 5 分鐘
↓
Firing
為什麼 Pending 很重要?
以前我在看監控的時候,可能會直覺覺得:
超過 Threshold 就算異常。
但實際設定告警時,會發現「持續多久」其實同樣重要。
假設 CPU:
10:01 45%
10:02 96%
10:03 52%
這比較像短暫負載。
但如果:
10:01 95%
10:02 96%
10:03 94%
10:04 97%
10:05 96%
10:06 95%
就比較值得注意。
所以我們真正想抓的不是:
CPU 曾經超過 90%。
而是:
CPU 是否持續處在異常狀態。
現在架構多了一個東西
昨天我們的流程是:
server01
↓
Node Exporter
↓
Prometheus
↓
Grafana
↓
Dashboard
今天變成:
server01
↓
Node Exporter
↓
Prometheus
↓
Grafana
├── Dashboard
│
└── Alert Rule
↓
CPU > 90%
↓
Firing
雖然只是多了一條規則,但意義其實不太一樣。
前面是:
人去看系統有沒有問題。
現在開始變成:
系統先幫我們判斷是不是有問題。
Day 6 完成
今天我們完成了第一條真正的監控規則:
✓ 使用 Prometheus CPU Metrics
✓ 建立 Grafana Alert Rule
✓ 設定 CPU > 90%
✓ 設定持續 5 分鐘
✓ 了解 Normal / Pending / Firing
目前先不要急著建立十幾條 Alert。
先確定:
server01 CPU 過高時,Grafana 能正確判斷並進入 Firing。
這一步正常之後,後面 Memory、Disk、Service Down 都可以用相同方式慢慢加進來。
但現在還差最後一步
雖然 Grafana 已經知道:
Server01 High CPU
Status:Firing
可是如果沒有人打開 Grafana,還是不會知道。
所以接下來要解決的是:
告警發生之後,怎麼主動送到我們手上?